package other;

/**
 * Created by lyyn on 2022/9/15.
 */
/*
题意：

        在链表类中实现这些功能：

        get(index)：获取链表中第 index 个节点的值。如果索引无效，则返回-1。
        addAtHead(val)：在链表的第一个元素之前添加一个值为 val 的节点。
        插入后，新节点将成为链表的第一个节点。
        addAtTail(val)：将值为 val 的节点追加到链表的最后一个元素。
        addAtIndex(index,val)：在链表中的第 index 个节点之前添加值为 val  的节点。
        如果 index 等于链表的长度，则该节点将附加到链表的末尾。
        如果 index 大于链表长度，则不会插入节点。
        如果index小于0，则在头部插入节点。
        deleteAtIndex(index)：如果索引 index 有效，则删除链表中的第 index 个节点。
*/
public class MyLinkedList_707 {
    int size = 0;
    ListNode head = new ListNode(0);
    public MyLinkedList_707() {

    }

    public int get(int index) {
        if(index < 0 || index > size - 1 || size == 0){
            return -1;
        }
        ListNode cur = head;
        while (index >= 0) {
            cur = cur.next;
            index--;
        }
        return cur.val;
    }

    public void addAtHead(int val) {
        ListNode addNode = new ListNode(val);
        addNode.next = head.next;
        head.next = addNode.next;
        size++;
    }

    public void addAtTail(int val) {
        ListNode cur = head;
        while (cur.next != null){
            cur = cur.next;
        }
        ListNode addNode = new ListNode(val);
        cur.next = addNode;
        size++;
    }

    public void addAtIndex(int index, int val) {
        if(index == size){
            addAtTail(val);
        }
        if(index < 0){
            addAtHead(val);
        }
        if(index > size){
            return;
        }
        ListNode cur = head;
        while (index > 0){
            cur = cur.next;
            index--;
        }
        ListNode addNode = new ListNode(val);
        addNode.next = cur.next;
        cur.next = addNode;
        size++;
    }

    public void deleteAtIndex(int index) {
        if(index >= 0 && index < size){
            ListNode cur = new ListNode(-1,head);
            while (index > 0){
                cur = cur.next;
                index--;
            }
            cur.next = cur.next.next;
            size--;
        }

    }

}
